package cn.wolfcode._01hello;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 *  生产者
 */
public class Producer {
    // 同步发送消息 -----------------------------------------------
    /*public static void main(String[] args) throws Exception {
        // 实例化消息生产者Producer
        DefaultMQProducer producer = new DefaultMQProducer("wolfcode_producer");
        // 设置NameServer的地址
        producer.setNamesrvAddr("192.168.204.128:9876"); // 注意修改为服务所在的电脑ip
        // 启动Producer实例
        producer.start();
        for(int i=0;i<10;i++){
            // 创建消息，并指定Topic，Tag和消息体
            Message msg = new Message("TopicTest","TagA",("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
            // 发送消息到一个Broker
            SendResult sendResult = producer.send(msg);
            // 通过sendResult返回消息是否成功送达
            System.out.println(sendResult);
        }
        // 如果不再发送消息，关闭Producer实例。
        System.out.println("消息发送完成");
        producer.shutdown();
    }*/


    // 异步发送消息 ---------------------------------------------
/*    public static void main(String[] args) throws Exception {
        // 实例化消息生产者Producer
        DefaultMQProducer producer = new DefaultMQProducer("wolfcode_producer");
        // 设置NameServer的地址
        producer.setNamesrvAddr("192.168.204.128:9876");
        // 启动Producer实例
        producer.start();
        for(int i=0;i<10;i++){
            // 创建消息，并指定Topic，Tag和消息体
            Message msg = new Message("TopicTest","TagA",("异步消息" + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
            // 发送消息到一个Broker
            producer.send(msg, new SendCallback() {
                @Override
                public void onSuccess(SendResult sendResult) {
                    System.out.println("消费线程:"+Thread.currentThread().getName()+"发送成功，消息ID："+sendResult.getMsgId());
                }
                @Override
                public void onException(Throwable e) {
                    System.out.println("消费线程:"+Thread.currentThread().getName()+"发送失败");
                    e.printStackTrace();
                }
            });
        }
        // 等待5s
        TimeUnit.SECONDS.sleep(5);
        // 如果不再发送消息，关闭Producer实例。

        producer.shutdown();
    }*/


    // 一次性消息 -------------------------------------------
    /*public static void main(String[] args) throws Exception{
        // 实例化消息生产者Producer
        DefaultMQProducer producer = new DefaultMQProducer("wolfcode_producer");
        // 设置NameServer的地址
        producer.setNamesrvAddr("192.168.204.128:9876");
        // 启动Producer实例
        producer.start();
        for (int i = 0; i < 10; i++) {
            // 创建消息，并指定Topic，Tag和消息体
            Message msg = new Message("TopicTest" ,
                    "TagA" ,
                    ("一次性消息 " + i).getBytes(RemotingHelper.DEFAULT_CHARSET)
            );
            // 发送单向消息，没有任何返回结果
            producer.sendOneway(msg);
        }
        // 如果不再发送消息，关闭Producer实例。
        System.out.println("发送结束");
        producer.shutdown();
    }*/

    // 集群和广播模式 --------------------
    public static void main(String[] args) throws Exception {
        // 实例化消息生产者Producer
        DefaultMQProducer producer = new DefaultMQProducer("wolfcode_producer-jiqun");
        // 设置NameServer的地址
        producer.setNamesrvAddr("192.168.204.128:9876"); // 注意修改为服务所在的电脑ip
        // 启动Producer实例
        producer.start();

        // 设置延时级别
        //msg.setDelayTimeLevel(3);

        // 发送消息到Broker
        for (int i = 0; i < 10; i++) {
            // 创建消息，并指定Topic，Tag和消息体
            Message msg = new Message("jiqunTopic",("集群消息" + i ).getBytes());

            producer.sendOneway(msg);

            //TimeUnit.SECONDS.sleep(1);
        }


        // 如果不再发送消息，关闭Producer实例。
        System.out.println("消息发送完成");
        producer.shutdown();
    }

}